#! /bin/sh

if test x"$1" = x"-h" -o x"$1" = x"--help" ; then

echo "Usage: ./configure [options]"
echo ""
echo "available options:"
echo ""
echo "  --help                   print this message"
echo "  --enable-avis-input      enables avisynth input (win32 only)"
echo "  --enable-mp4-output      enables mp4 output (using gpac)"
echo "  --enable-vfw             compiles the VfW frontend"
echo "  --enable-gtk             build GTK+ interface"
echo "  --enable-pthread         enables multithreaded encoding"
echo "  --enable-debug           adds -g, doesn't strip"
echo "  --enable-gprof           adds -pg, doesn't strip"
echo "  --enable-visualize       enables visualization (X11 only)"
echo "  --enable-pic             build position-independent code"
echo "  --enable-shared          build libx264.so"
echo "  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS"
echo "  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS"
echo "  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS"
echo ""
exit 1
fi

cc_check() {
    rm -f conftest*
    cat > conftest.c << EOF
#include <$1>
int main () { $3 return 0; }
EOF
    $CC $CFLAGS $LDFLAGS $2 conftest.c -o conftest 2>$DEVNULL
    TMP="$?"
    rm -f conftest.c conftest*
    return $TMP
}

rm -f config.h config.mak x264.pc

prefix='/usr/local'
exec_prefix='${prefix}'
bindir='${exec_prefix}/bin'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
DEVNULL='/dev/null'

avis_input="auto"
mp4_output="auto"
pthread="auto"
debug="no"
gprof="no"
pic="no"
vfw="no"
gtk="no"
vis="no"
shared="no"

CC="${CC-gcc}"
CFLAGS="-Wall -I. -O4 -ffast-math -D__X264__"
LDFLAGS=""
HAVE_GETOPT_LONG=1

AS="nasm"
ASFLAGS=""

EXE=""

UNAMES="`uname -s`"
case "$UNAMES" in
  BeOS)
    SYS="BEOS"
    CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
    ;;
  Darwin)
    SYS="MACOSX"
    CFLAGS="$CFLAGS -falign-loops=16"
    LDFLAGS="$LDFLAGS -lm -lmx"
    ;;
  FreeBSD)
    SYS="FREEBSD"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  NetBSD)
    SYS="NETBSD"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  OpenBSD)
    SYS="OPENBSD"
    CFLAGS="$CFLAGS -I/usr/X11R6/include"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  Linux)
    SYS="LINUX"
    CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
    LDFLAGS="$LDFLAGS -lm"
    ;;
  CYGWIN*)
    SYS="CYGWIN"
    CFLAGS="$CFLAGS -mno-cygwin"
    LDFLAGS="$LDFLAGS -mno-cygwin"
    EXE=".exe"
    DEVNULL="NUL"
    ;;
  MINGW*)
    SYS="MINGW"
    EXE=".exe"
    DEVNULL="NUL"
    ;;
  SunOS)
    SYS="SunOS"
    CFLAGS="$CFLAGS -DHAVE_MALLOC_H"
    LDFLAGS="$LDFLAGS -lm"
    HAVE_GETOPT_LONG=0
    ;;
  *)
    echo "Unknown system $UNAMES, edit the configure"
    exit 1
    ;;
esac

UNAMEM="`uname -m`"
case "$UNAMEM" in
  i386|i486|i586|i686|BePC)
    ARCH="X86"
    CFLAGS="$CFLAGS -DHAVE_MMXEXT -DHAVE_SSE2"
    AS="nasm"
    ASFLAGS="-O2"
    if [ "$SYS" = MACOSX ]; then
      ASFLAGS="$ASFLAGS -f macho -DPREFIX"
    elif [ "$SYS" = CYGWIN -o "$SYS" = MINGW ]; then
      ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
    elif [ "$SYS" = NETBSD ]; then
      ASFLAGS="$ASFLAGS -f aoutb"
    else
      ASFLAGS="$ASFLAGS -f elf"
    fi
    ;;
  x86_64)
    ARCH="X86_64"
    CFLAGS="$CFLAGS -DHAVE_MMXEXT -DHAVE_SSE2"
    AS="yasm"
    ASFLAGS="-f elf -m amd64"
    ;;
  "Power Macintosh"|ppc|ppc64)
    ARCH="PPC"
    if [ $SYS = MACOSX ]
    then
      CFLAGS="$CFLAGS -faltivec -fastf -mcpu=G4"
    else
      CFLAGS="$CFLAGS -maltivec -mabi=altivec"
    fi
    ;;
  sun4m|sun4d|sparc|sparc64)
    ARCH="Sparc"
    ;;
  sun4u)
    ARCH="UltraSparc"
    CFLAGS="$CFLAGS -mcpu=ultrasparc"
    LDFLAGS="$LDFLAGS -mcpu=ultrasparc"
    AS="as"
    ASFLAGS="-xarch=v8plusa"
    ;;
  ia64)
    ARCH="IA64"
    ;;
  alpha)
    ARCH="ALPHA"
    ;;
  mips|mipsel|mips64)
    ARCH="MIPS"
    ;;
  m68k)
    ARCH="M68K"
    ;;
  arm|armv5tel|armv4l)
    ARCH="ARM"
    ;;
  s390|s390x)
    ARCH="S390"
    ;;
  parisc|parisc64)
    ARCH="PARISC"
    ;;
  *)
    echo "Unknown platform $UNAMEM, edit the configure"
    exit 1
    ;;
esac

CFLAGS="$CFLAGS -DARCH_$ARCH -DSYS_$SYS"

# parse options

for opt do
    optarg="${opt#*=}"
    case "$opt" in
        --prefix=*)
            prefix="$optarg"
            ;;
        --exec-prefix=*)
            exec_prefix="$optarg"
            ;;
        --bindir=*)
            bindir="$optarg"
            ;;
        --libdir=*)
            libdir="$optarg"
            ;;
        --includedir=*)
            includedir="$optarg"
            ;;
        --enable-avis-input)
            avis_input="yes"
            ;;
        --disable-avis-input)
            avis_input="no"
            ;;
        --enable-mp4-output)
            mp4_output="yes"
            ;;
        --disable-mp4-output)
            mp4_output="no"
            ;;
        --extra-asflags=*)
            ASFLAGS="$ASFLAGS ${opt#--extra-asflags=}"
            ;;
        --extra-cflags=*)
            CFLAGS="$CFLAGS ${opt#--extra-cflags=}"
            VFW_CFLAGS="${opt#--extra-cflags=}"
            ;;
        --extra-ldflags=*)
            LDFLAGS="$LDFLAGS ${opt#--extra-ldflags=}"
            VFW_LDFLAGS="${opt#--extra-ldflags=}"
            ;;
        --enable-pthread)
            pthread="yes"
            ;;
        --disable-pthread)
            pthread="no"
            ;;
        --enable-debug)
            CFLAGS="$CFLAGS -g"
            debug="yes"
            ;;
        --enable-gprof)
            CFLAGS="$CFLAGS -pg"
            LDFLAGS="$LDFLAGS -pg"
            gprof="yes"
            ;;
        --enable-pic)
            pic="yes"
            ;;
        --enable-vfw)
            vfw="yes"
            ;;
        --disable-vfw)
            vfw="no"
            ;;
        --enable-gtk)
            gtk="yes"
            ;;
        --disable-gtk)
            gtk="no"
            ;;
        --enable-shared)
            shared="yes"
            if [ $ARCH = "X86_64" -o $ARCH = "PPC" -o $ARCH = "ALPHA" ] ; then
                pic="yes"
            fi
            ;;
        --enable-visualize)
            LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11"
            CFLAGS="$CFLAGS -DVISUALIZE=1"
            vis="yes"
            ;;
        *)
            echo "Unknown option $opt, ignored"
            ;;
    esac
done

# autodetect options that weren't forced nor disabled

if test "$pthread" = "auto" ; then
    case $SYS in
        MINGW|CYGWIN|BEOS)
            pthread="yes"
            ;;
        *)
            pthread="no"
            cc_check pthread.h -lpthread && pthread="yes"
            ;;
    esac
fi
if test "$pthread" = "yes" ; then
    CFLAGS="$CFLAGS -DHAVE_PTHREAD"
    case $SYS in
        MINGW|CYGWIN|BEOS)
            ;;
        *) LDFLAGS="$LDFLAGS -lpthread"
            ;;
    esac
fi

MP4_LDFLAGS="-lgpac_static"
if [ $SYS = CYGWIN -o $SYS = MINGW ]; then
    MP4_LDFLAGS="$MP4_LDFLAGS -lwinmm"
fi
if [ "$mp4_output" = "auto" ] ; then
    mp4_output="no"
    cc_check gpac/isomedia.h "$MP4_LDFLAGS" && mp4_output="yes"
fi
if [ "$mp4_output" = "yes" ] ; then
    echo "#define MP4_OUTPUT" >> config.h
    LDFLAGS="$LDFLAGS $MP4_LDFLAGS"
fi

if [ "$avis_input" = "auto" ] ; then
    if [ $SYS = CYGWIN -o $SYS = MINGW ]; then
        avis_input="yes"
    else
        avis_input="no";
    fi
fi
if [ "$avis_input" = "yes" ] ; then
    echo "#define AVIS_INPUT" >> config.h
    LDFLAGS="$LDFLAGS -lvfw32"
fi

if [ "$pic" = "yes" ] ; then
    CFLAGS="$CFLAGS -fPIC"
    ASFLAGS="$ASFLAGS -D__PIC__"
fi

if [ "$debug" != "yes" -a "$gprof" != "yes" ]; then
    CFLAGS="$CFLAGS -s -fomit-frame-pointer"
    LDFLAGS="$LDFLAGS -s"
    VFW_LDFLAGS="$VFW_LDFLAGS -s"
fi

if cc_check "stdio.h" "" "fseeko(stdin,0,0);" ; then
    echo "#define fseek fseeko" >> config.h
    echo "#define ftell ftello" >> config.h
elif cc_check "stdio.h" "" "fseeko64(stdin,0,0);" ; then
    echo "#define fseek fseeko64" >> config.h
    echo "#define ftell ftello64" >> config.h
fi

# generate config files

cat > config.mak << EOF
prefix=$prefix
exec_prefix=$exec_prefix
bindir=$bindir
libdir=$libdir
includedir=$includedir
ARCH=$ARCH
SYS=$SYS
CC=$CC
CFLAGS=$CFLAGS
LDFLAGS=$LDFLAGS
AS=$AS
ASFLAGS=$ASFLAGS
VFW=$vfw
GTK=$gtk
EXE=$EXE
VIS=$vis
HAVE_GETOPT_LONG=$HAVE_GETOPT_LONG
DEVNULL=$DEVNULL
EOF

echo -n 'CONFIGURE_ARGS=' >> config.mak
for A in "$@" ; do
    echo -n " '$A'" >> config.mak
done
echo '' >> config.mak

cp config.mak gtk/config.mak

if [ "$vfw" = "yes" ]; then
    rm -f vfw/build/cygwin/config.mak
    cat > vfw/build/cygwin/config.mak << EOF
CFLAGS=$VFW_CFLAGS
LDFLAGS=$VFW_LDFLAGS
EOF
    echo "default: x264vfw.dll" >> config.mak
fi

if [ "$shared" = "yes" ]; then
    API=`grep '#define X264_BUILD' < x264.h | cut -f 3 -d ' '`
    echo "SONAME=libx264.so.$API" >> config.mak
    echo 'default: $(SONAME)' >> config.mak
    if [ "$gtk" = "yes" ]; then
        echo "SONAMEGTK=libx264gtk.so.$API" >> gtk/config.mak
    fi
fi

if [ "$gtk" = "yes" ]; then
    echo 'default: libx264gtk.a' >> config.mak
    echo 'install: install-gtk' >> config.mak
fi

./version.sh

pclibs="-L$libdir -lx264"
if test "$pthread" = "yes" ; then
  case $SYS in
    MINGW|CYGWIN|BEOS)
      ;;
    *) pclibs="$pclibs -lpthread"
      ;;
  esac
fi

cat > x264.pc << EOF
prefix=$prefix
exec_prefix=$exec_prefix
libdir=$libdir
includedir=$includedir

Name: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: $(grep POINTVER < config.h | sed -e 's/.* "//; s/".*//')
Libs: $pclibs
Cflags: -I$includedir
EOF


echo "Platform:   $ARCH"
echo "System:     $SYS"
echo "avis input: $avis_input"
echo "mp4 output: $mp4_output"
echo "pthread:    $pthread"
echo "vfw:        $vfw"
echo "gtk:        $gtk"
echo "debug:      $debug"
echo "gprof:      $gprof"
echo "PIC:        $pic"
echo "shared:     $shared"
echo "visualize:  $vis"
echo
echo "You can run 'make' or 'make fprofiled' now."

